1.5小时成交破20亿!淘系又一次稳稳扛住了大流量!
低延迟技术选型
▐ 当前直播技术延迟
重传慢:TCP 的 ACK 确认机制,丢包后发送侧超时重传,超时时间一般200ms,会造成接收侧帧抖动。
拥塞判断不准确:基于丢包的拥塞控制算法无法准确判断拥塞,丢包并不等于拥塞;也会造成发送链路 bufferbloat,链路 RTT 增大,延迟增加。
灵活性差:这是最主要原因,TCP 拥塞控制算法在操作系统内核层实现,优化成本较高,移动端只有利用系统已有的优化。
▐ 低延迟直播技术选型
我们从五个维度对两种方案做了对比:
传输方式:Quic 是可靠传输;而 RTC 是半可靠传输,特定情境下可对音视频有损传输,可有效降低延迟。
复杂度:Quic 的复杂度非常低,相当于将 TCP 接口换位 Quic 接口即可,RTC方案的复杂很高,涉及一整套的协议设计和QOS保障机制。
音视频友好性:Quic 不关心传输内容,对音视频数据透明传输。RTC 对音视频更友好,可针对音视频做定制化优化。
方案完备性:从方案完备性方面来讲,Quic 是针对传输层优化,而 WebRTC 可提供端对端优化方案。
理论延迟:经我们实验室测试以及线上数据分析,WebRTC 方案的延迟可以达到 1 秒以内。
综上,Quic 方案的最大优点是复杂度低,不过这个方案要想达到更低的延迟,也需要引入更多的复杂度。从方案的先进性上看,我们选择 WebRTC 技术作为我们的低延迟方案。同时,我们也相信,RTC 技术和直播技术的融合,是未来音视频传输技术的一个趋势。
上行接入:可接入三种输入方式,第一种是 H5 终端,使用标准 WebRTC 推流到RTS系统中;第二种是 OBS 等传统 RTMP 推流软件,使用 RTMP 协议推流到 RTS 系统中;第三种是低延迟推流端,可以使用我们基于 RTP/RTCP 扩展的私有协议推流到RTS系统中。
下行分发:它提供两种低延迟分发,第一种是标准WebRTC 分发,另一种是我们在 WebRTC 基础上的私有协议扩展,淘宝直播目前使用最多的就是基于私有协议的分发。
▐ 低延迟直播技术
标准 WebRTC 终端如何接入
Native 终端接入如何获得更好体验
如何基于 WebRTC 设计低延迟直播端方案
播放器如何修改支持低延迟直播
▐ 标准 WebRTC 接入流程
播放端端发送接入请求:通过 HTTP 发送 AccessRequest ,携带播放 URL 和 offer SDP;
RTS 收到播放的接入请求后,记录 offerSDP 和 URL ,然后创建 answerSDP,生成一次会话 token 并设置到 SDP 的 ufrag 字段,通过 http 响应发送给客户端。
客户端设置 answerSDP,发送 Binding Request 请求,请求中 USERNAME 字段携带 answerSDP 中的 ufrag(即 RTS 下发的 token )。
RTS 收到 Binding Request,根据 USERNAME 中的 token,找到之前 HTTP 请求相关信息,记录用户 IP 和端口。 借助 Binding Request 的 USERNAME 传递 token 是由于 RTS 是单端口方案,需要根据 UDP 请求中的 token 信息确定是哪个用户的请求。传统的 WebRTC 是根据端口区分用户,RTS 为每个用户设置端口会带来巨大的运维成本。
标准 WebRTC 接入过程会有各种限制:
它不支持直播中常用音频 AAC 编码和 44.1k 采样率。
其它不支持视频 B 帧、H265等编码特性,多 slice 编码在弱网下也会花屏。
WebRTC 建联过程耗时过长,会影响秒开体验。
基于以上的这些问题,我们设计了更为高效、兼容性更好的私有协议接入。
▐ 私有协议接入流程
发送播放请求:通过 UDP 发送 PlayRequest ,携带播放 URL ;
RTS 收到播放请求后,立即返回临时响应,并且开始回源;
RTS 回源成功后,发送最终响应,携带相关媒体描述(编解码等);
客户端发送最终响应 ACK,通知服务端最终响应接收成功;
RTS 发送媒体数据:RTP/RTCP,连接建立成功;
PlayRequest 的作用是将 URL 告诉 CDN,同时兼具 UDP 打洞功能;
协议中信令和媒体在一个 UDP 通道传输;
四次握手流程设计,保证建联速度的同时,确保重要信息可靠到达;
整个建联过程只有一个 RTT,建联速度快;
▐ 私有协议状态机设计
初始状态下发送播放请求,然后会进入等待临时相应状态;
在临时响应状态会启动毫秒级快速重发定时器,超时未收到临时响应则快速重传播放请求,保证建联速度;
收到临时响应后进入等待最终响应状态,这时会开始更长的秒级定时器;
收到最终响应建联成功;
▐ 私有协议信令设计
同时,我们选择 RTCP 消息中的 APP 消息承载我们的私有信令。APP消息是RTCP 提供的一种为新应用、新功能使用的一种扩展协议,即它是 RTCP 提供的一种官方扩展方式,应用层可以自己定义消息类型以及内容。此外,选择此协议也基于以下考虑:
使用 RTCP-APP 可以解决私有协议和标准 RTP/RTCP 区分问题。如之前所讲,媒体和信令在同一个通道,服务端收到后如何区分私有协议、RTCP 包以及原生 RTCP 包,RFC3550 有清晰的描述,帮助我们解决了这个问题。
使用此协议可以直接使用现有包分析工具解析抓包。
我们可复用 RTCP 相关定义,例如 payload type、subtype、ssrc 等。
▐ RTCP-APP 消息介绍
▐ 私有协议媒体部分设计
对 RTP 的扩展部分使用标准的RTP扩展,为了和 WebRTC 兼容,标准 RTP 扩展头部定义使用了 rfc5285 标准。例如RTP协议是戳使用了 DTS ,标准头中是无法携带 PTS 的,这会导致部分硬解异常,所以我们通过扩展头部定义携带了 CTS 。
▐ 两种接入方式对比
标准 WebRTC 接入除了 HTTP 建联请求外,全部符合 WebRTC 规范。
标准终端方便接入。
可快速实现原型。
建联过程耗时长,使用HTTP情况下达到5RTT,选用HTTPS会更长。
媒体必须加密传输。
音视频有相关限制,使用时需要在服务端转码。
基于标准扩展信令和媒体协议,与标准协议差异很小。
建联速度快,秒开体验非常好。
支持直播技术栈,增加了媒体兼容性,减少了服务端转码成本。
虽基于标准扩展,但仍然带来了部分私有化实现。
使用私有协议后,复杂度有所提升。
▐ 流程协议设计原则
尽量使用标准,包括 WebRTC 相关规范。这个原则意味着我们和标准 WebRTC 互通,会非常方便。
当标准和体验发生冲突时,优先保障体验。
当需要扩展时,基于标准协议扩展,并且使用标准扩展方式。
▐ 基于 WebRTC 全模块的接入方案
这个方案的优缺点并存:
优点:
经过多年发展,它非常成熟,很稳定,同时提供了完整的解决方案,包括 NACK、jitterbuffer、NetEQ 等可直接用于低延迟直播。
它的缺点也很很明显。如上图中是WebRTC整体架构,它是一个从采集、渲染、编解码到网络传输的完备的端对端方案,对现有推流端和播放端侵入性极大,复杂度极高。
RTC技术栈和直播技术栈存在差异,他不支持B帧、265等特性。在QOS策略方面,WebRTC的原生应用场景是通话,它的基本策略是延迟优于画质,这个策略在直播中不一定成立。
包大小:所有webrtc模块全部加入到APP中,包大小至少增加3M。
▐ 基于 WebRTC 传输层的接入方案
我们在这些基础模块上进行了封装,将他们封装成 FFmpeg 插件注入到 FFmpeg 中。之后播放器可直接调用 FFmpeg 相关方法打开 URL 即可接入我们的私有低延迟直播协议。这样可极大减少播放器和推流端的修改,降低对低延迟直播技术对原有系统的侵入。同时,使用基础模块也极大减少了包大小的占用。
▐ 播放器针对低延迟直播的修改
接入低延迟直播系统后,整体架构如图下面部分:FFmpeg 增加低延迟直播插件支持我们的私有协议;将播放器的缓冲设置为0秒,FFmpeg 输出的音视频帧直接送入解码器进行解码,然后同步,渲染。我们将播放器原先的缓冲区移动到了我们的传输层SDK中,使用jitterbuffer可以根据网络质量好坏动态的调整缓冲区大大小。
现在的 WebRTC 开源软件还不能很好支持直播,希望未来的标准 WebRTC 能很好直播,这样我们可以很方便的在浏览器上做低延迟直播。
5G 到来后,网络环境会越来越好,低延迟直播技术会成为直播行业未来的一个技术方向。
现在各厂商的低延迟直播协议大都存在私有协议,对用户来说,从一个厂商切换到另一个厂商时成本会很高。低延迟直播协议的统一、标准化对直播行业非常重要。一个基本判断是,随着低延迟直播技术的方案和普及,低延迟直播协议在未来一定会走向统一化和标准化。也希望我们国家的技术厂商能够在推动低延迟直播标准化的过程中发出自己的声音,贡献自己的力量。